package com.nextel.project.devolucion.mvc.validate;

import com.nextel.project.cliente.ControlCliente;
import com.nextel.project.devolucion.ControlDevolucion;
import com.nextel.project.devolucion.bean.DevolucionBean;
import com.nextel.project.devolucion.bean.DevolucionDetalleBean;
import com.nextel.project.devolucion.mvc.MVCResumenDevolucion;
import com.nextel.project.usuario.ControlUsuario;
import com.nextel.ui.OGridObjectRow;
import com.nextel.ui.custom.ConstantesItems;
import com.nextel.ui.custom.TableEditListener;
import pe.com.nextel.idioma.IdiomaManager;
import pe.com.nextel.util.math.MathUtil;

/**
 *
 * @author edgard
 */
public class ValidateDevolucionResumenForm implements TableEditListener {

    // indica la columna de ingreso de cantidad
    private final static int COLUMNA_CODIGO = 0;
    private final static int COLUMNA_CANTIDAD = 1;
    //private final static int COLUMNA_DECIMAL = 2;
    private final static int COLUMNA_TOTAL = 2;
    private final static int TAM_PROD_BUSCAR = 6;
    private final static int TAM_NOMBRE_PROD_MOSTRAR = 45;
    private MVCResumenDevolucion mvc;
    private boolean flagEditable = true;
    private String CantAnt;
    //private boolean flagDecimal = false;
    //   PedidoDetalleBean actionBussinesst.getCurrentPedidoDetalle();

    public ValidateDevolucionResumenForm(MVCResumenDevolucion mvc) {
        this.mvc = mvc;
    }

    public boolean validarAgregar() {
        //#debug
//        System.out.println("validarAgregar");

        return !verificarSiExiste() && validarFilasVacias();
    }

    public boolean validarEliminar() {
        //#debug
//        System.out.println("validarEliminar");
        ControlDevolucion.getInstance().currentDevolucion.removeArticulo(mvc.getTable().getValor(COLUMNA_CODIGO));
        return true;
    }

    // cuando el usuario escribe en cada celda
    public void dataChange() {
        //#debug
//        System.out.println("dataChange");
        switch (mvc.getTable().getColumna()) {

            // si el codigo de producto es igual TAM_PROD_BUSCAR
            // realiza la busqueda y salta a la siguiente columna
            case COLUMNA_CODIGO:
                if (mvc.getTable().getValor(COLUMNA_CODIGO).length() == TAM_PROD_BUSCAR) {
                    mvc.getTable().keyPressed(ConstantesItems.KEY_RIGHT);
                }
                break;
            // si esta en la columna de ingreso de cantidad realiza el calculo
            case COLUMNA_CANTIDAD:
                //ControlPedido.getInstance().currentPedidoDetalle.setStockArticulo( ControlPedido.getInstance().currentPedidoDetalle.getStockArticuloDB() );
                calcularFila();
                break;
            /*case COLUMNA_DECIMAL:
            calcularFila();
            break;
             */
        }
    }

    private boolean stockValido() {
        /*
        boolean retVal = false;
        if(getCantidadTable().equals(""))
        return retVal;
        
        int cantidad_tabla = Integer.parseInt(getCantidadTable());
        int stock = Integer.parseInt(ControlPedido.getInstance().currentPedidoDetalle.getStockArticulo());
        if( cantidad_tabla <= stock ){
        int newStock = (stock - cantidad_tabla);
        ControlPedido.getInstance().currentPedidoDetalle.setStockArticulo(String.valueOf(newStock));
        retVal = true;
        }
        return retVal;
         */
        return true;
    }

    private String getCantidadTable() {
        /*
        String monto = "";
        if (mvc.getTable().getValor(COLUMNA_DECIMAL).length() > 0) {
        switch (mvc.getTable().getValor(COLUMNA_DECIMAL).charAt(0)) {

        case TablaEditItem.VAL_CUARTO:
        monto = ".25";
        break;
        case TablaEditItem.VAL_MEDIO:
        monto = ".5";
        break;
        case TablaEditItem.VAL_TRESCUARTO:
        monto = ".75";
        break;
        }
        }
        return mvc.getTable().getValor(COLUMNA_CANTIDAD) + monto;
         */
        return mvc.getTable().getValor(COLUMNA_CANTIDAD);
    }

    /**
     * Realiza el proceso de calculo del precio de la fila actual
     */
    private void calcularFila() {
        //#debug
//        System.out.println("calcularFila");

        try {
            // si no varia la cantidad no se realiza el calculo
            // si los dos son vacios
            if (getCantidadTable().equals(ControlDevolucion.getInstance().currentDevolucionDetalle.getCantidad())) {
                return;
            }

            //if (Integer.parseInt(getCantidadTable()) <= 0) {
            if (MathUtil.esMayorIgual("0", getCantidadTable())) {
                ControlUsuario.getInstance().showMensaje(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_INGRESAR_MAYOR_CERO), mvc.getScreen());//"Debe ingresar una cantidad mayor a cero"
                mvc.getTable().setDatosColumna(COLUMNA_CANTIDAD, "");
                return;
            }

            // si son el mismo numero
            if (ControlDevolucion.getInstance().currentDevolucionDetalle.getCantidad() != null &&
                    !"".equals(ControlDevolucion.getInstance().currentDevolucionDetalle.getCantidad()) &&
                    !"".equals(getCantidadTable()) &&
                    (MathUtil.compareFloat(getCantidadTable(), ControlDevolucion.getInstance().currentDevolucionDetalle.getCantidad()) == 0)) {
                return;
            }

            ControlDevolucion.getInstance().currentDevolucionDetalle.setCantidad(getCantidadTable());


            // recalcula el monto total
            calcularMontoTotal();

        } catch (Exception ex) {
            ex.printStackTrace();

        }

    }

    public void estadoAnterior() {
        /*if (mvc.getTable().getColumna() == COLUMNA_CANTIDAD) {
        if ( (!getCantidadTable().equals("")) && ( !CantAnt.equals(getCantidadTable()) ) && (!stockValido()) )  {
        String cant = getCantidadTable();
        ControlPedido.getInstance().currentPedidoDetalle.setStockArticulo( ControlPedido.getInstance().currentPedidoDetalle.getStockArticuloDB() );
        mvc.getTable().setDatosColumna(COLUMNA_CANTIDAD, "");
        mvc.getTable().setDatosColumna(COLUMNA_TOTAL, "");
        mvc.setTitulo();
        ControlUsuario.getInstance().showMensaje( "La cantidad ingresada es mayor al stock disponible", mvc.getScreen() );
        }
        }*/
    }

    /**
     * es cuando te posicionas en la celda de la tabla
     */
    public void estadoActual() {
        //#debug
//        System.out.println("estadoActual" );

//        flagDecimal = false;

        // si ya se ingreso en la tabla se limpia la celda
        if (verificarSiExiste()) {
            ControlUsuario.getInstance().showError(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_PRODUCTO_EXISTE), mvc.getScreen());//"El producto ingresado ya existe en el pedido actual"

            mvc.getTable().setDatosColumna(COLUMNA_CODIGO, "");
            return;
        }

        //flagEditable = true;
        // realiza la busqueda
        DevolucionDetalleBean dDevolucion = buscar(mvc.getTable().getValor(COLUMNA_CODIGO));

        if (dDevolucion != null) {

            ControlDevolucion.getInstance().currentDevolucionDetalle = dDevolucion;

            //habilitarIngresoCampos(false, true, true, false);
            habilitarIngresoCampos(false, true);

            // cortamos el nombre del articulo
            mvc.getString().setLabel(ControlCliente.getInstance().currentCliente.getNombre());
            mvc.getString().setLabel(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_MOTIVO)+": " + ControlDevolucion.getInstance().currentDevolucionDetalle.getNombreMotivo());//"Motivo: "

            /* if (ControlDevolucion.getInstance().currentDevolucionDetalle.getNombreMotivo().length() > TAM_NOMBRE_PROD_MOSTRAR) {
            mvc.getString().setLabel(ControlDevolucion.getInstance().currentDevolucionDetalle.getNombreMotivo().substring(0, TAM_NOMBRE_PROD_MOSTRAR));
            } else {
            mvc.getString().setLabel(ControlDevolucion.getInstance().currentDevolucionDetalle.getNombreMotivo());
            }*/

            //CantAnt = getCantidadTable();

        } else {

            //habilitarIngresoCampos(true, false, false, false);
            habilitarIngresoCampos(true, false);

            mvc.getTable().setDatosColumna(COLUMNA_CODIGO, "");
            //mvc.getString().setLabel(ControlCliente.getInstance().currentCliente.getNombre());
            mvc.getString().setLabel("----");
        }
        //mvc.repintaForm();
        //#debug
//        System.out.println("flagEditable=" + flagEditable);
    }

    /**
     * Se habilita o deshabilita el ingreso de valores en la tabla
     * @param codigo
     */
    //private void habilitarIngresoCampos(boolean codigo, boolean cantidad, boolean decimal, boolean total) {
    private void habilitarIngresoCampos(boolean codigo, boolean cantidad) {

        switch (mvc.getTable().getColumna()) {
            case COLUMNA_CODIGO:
                flagEditable = codigo;
                break;
            case COLUMNA_CANTIDAD:
                flagEditable = cantidad;
                break;
            /*case COLUMNA_DECIMAL:
            flagEditable = decimal;
            break;
            case COLUMNA_TOTAL:
            flagEditable = total;
            break;*/
        }
    }

    public boolean isEditable() {
        //#debug
//        System.out.println("isEditable");
        return flagEditable;
    }

    /**
     * Realiza el proceso de busqueda del articulo
     * si no existe retorna nulo
     * @param String codigoArticulo
     * @return PedidoDetalleBean
     */
    public DevolucionDetalleBean buscar(String codigoArticulo) {
        //#debug
//        System.out.println("buscar= |" + codigoArticulo + "|");

        // si es vacio retorna nulo
        if ("".equals(codigoArticulo)) {
            return null;
        }

        DevolucionBean devolucion = ControlDevolucion.getInstance().currentDevolucion;

        // 1.- realiza la busqueda de la devolucion existente
        DevolucionDetalleBean dDevolucion = devolucion.getDetalleDevolucion(codigoArticulo);

        /*
        //2.- si no existe recien buscamos en la base de datos del equipo
        if (dpedido == null) {
        dpedido = ControlPedido.getInstance().buscarPorCodigoProducto(codigoArticulo);

        // 3.- si existe lo ingresamos en la lista del pedido
        if (dpedido != null) {
        pedido.setDetallePedido(dpedido);
        }
        }
         */
        return dDevolucion;

    }

    private boolean verificarSiExiste() {
        int cant = mvc.getTable().getSizeDatos();
        if (cant > 0) {
            // obtenemos
            String codigoItem = mvc.getTable().getValor(COLUMNA_CODIGO);
            for (int i = 0; i < cant; i++) {
                // si es la misma fila no validar
                if (mvc.getTable().getLineSelected() == i) {
                    continue;
                }
                String codigo = mvc.getTable().getValor(i, COLUMNA_CODIGO);
                //
                if (codigoItem.equals(codigo)) {
                    return true;
                }
            }
        }
        return false;
    }

    public boolean validarTabla() {
        //#debug
//        System.out.println("validarTabla");

        int cant = mvc.getTable().getSizeDatos();
        for (int i = 0; i < cant; i++) {

            // no validamos la ultima fila si solo si esta vacia
            if ((i == cant - 1) && (mvc.getTable().getValor(i, COLUMNA_CODIGO).equals(""))) {
                return true;
            }

            //verifica que haya ingresado el codigo del producto
            if (mvc.getTable().getValor(i, COLUMNA_CODIGO).equals("")) {
                return false;
            }
//             verifica que tenga monto
//            if (mvc.getTable().getValor(i, COLUMNA_TOTAL).equals("")) {
//                return false;
//            }

            if (MathUtil.esMayorIgual("0", mvc.getTable().getValor(i, COLUMNA_CANTIDAD))) {
                return false;
            }

//            if (Integer.parseInt(mvc.getTable().getValor(i, COLUMNA_CANTIDAD)) <= 0) {
//                return false;
//            }
        }

//        if (mvc.getTable().getColumna() == COLUMNA_CANTIDAD) {
//            if(!stockValido()) { return false; }
//        }

        return true;
    }

    public boolean validarFilasVacias() {
        //#debug
//        System.out.println("validarTabla");

        int cant = mvc.getTable().getSizeDatos();

        for (int i = 0; i < cant; i++) {

            //verifica que haya ingresado el codigo del producto
            if (mvc.getTable().getValor(i, COLUMNA_CODIGO).equals("")) {
                return false;
            }

            // verifica que tenga monto
            //if (mvc.getTable().getValor(i, COLUMNA_TOTAL).equals("")) {
            //    return false;
            //}
        }
        return true;
    }

    public void filaEliminada() {
//        System.out.println("filaEliminada");
        calcularMontoTotal();
    }

    public void calcularMontoTotal() {

        //ControlPedido.getInstance().currentPedido.calcularMontoTotal();
        mvc.setTitulo();
    }

    public boolean validateDataChange(char valor) {
        //#debug
//        System.out.println("validateDataChange");
        boolean flag = true;
        return flag;
    }

    public boolean isDecimal(char valor) {
        return false;
    }

    public void buscarCodigoDescripcion() {
    }

    public void filaAgregada() {
    }

    public OGridObjectRow buildFila() {
        OGridObjectRow row = new OGridObjectRow(3);
        row.addCell(0, "");
        row.addEditableCell(1, "");
        row.addCell(2, "");
        return row;
    }
}
